Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

feature/wifi-provision/src/commonTest/kotlin/org/meshtastic/feature/wifiprovision/domain/NymeaWifiServiceTest.kt renovate/actions-setup-java-5.x (f17e586c) Text, 13.74 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tf0883e@fileTb4b4b4:Te6edf3SuppressTb4b4b4(Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4)

Tff7b72package T7ee787org.meshtastic.feature.wifiprovision.domain

Tff7b72import T7ee787kotlinx.coroutines.Dispatchers
Tff7b72import T7ee787kotlinx.coroutines.ExperimentalCoroutinesApi
Tff7b72import T7ee787kotlinx.coroutines.test.runTest
Tff7b72import T7ee787org.meshtastic.core.ble.BleWriteType
Tff7b72import T7ee787org.meshtastic.core.testing.FakeBleConnection
Tff7b72import T7ee787org.meshtastic.core.testing.FakeBleConnectionFactory
Tff7b72import T7ee787org.meshtastic.core.testing.FakeBleDevice
Tff7b72import T7ee787org.meshtastic.core.testing.FakeBleScanner
Tff7b72import T7ee787org.meshtastic.feature.wifiprovision.NymeaBleConstants.COMMANDER_RESPONSE_UUID
Tff7b72import T7ee787org.meshtastic.feature.wifiprovision.NymeaBleConstants.WIRELESS_COMMANDER_UUID
Tff7b72import T7ee787org.meshtastic.feature.wifiprovision.model.ProvisionResult
Tff7b72import T7ee787kotlin.test.Test
Tff7b72import T7ee787kotlin.test.assertEquals
Tff7b72import T7ee787kotlin.test.assertIs
Tff7b72import T7ee787kotlin.test.assertTrue

T8b949e/**
* Tests for [NymeaWifiService] covering BLE connect, network scanning, provisioning, and error handling. Uses
* [FakeBleScanner], [FakeBleConnection], and [FakeBleConnectionFactory] from `core:testing`.
*/
Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalCoroutinesApiTff7b72::Te6edf3classTb4b4b4)
Tff7b72class T56d364NymeaWifiServiceTest Tb4b4b4{

Tff7b72private Tff7b72val Te6edf3address Tff7b72= Ta5d6ff"Ta5d6ffAA:BB:CC:DD:EE:FFTa5d6ff"

Tff7b72private Tff7b72fun Td2a8ffcreateServiceTb4b4b4(
Te6edf3scannerTb4b4b4: Te6edf3FakeBleScanner Tff7b72= Te6edf3FakeBleScannerTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3connectionTb4b4b4: Te6edf3FakeBleConnection Tff7b72= Te6edf3FakeBleConnectionTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3TripleTff7b72<Te6edf3NymeaWifiServiceTb4b4b4, Te6edf3FakeBleScannerTb4b4b4, Te6edf3FakeBleConnectionTff7b72> Tb4b4b4{
Tff7b72val Te6edf3service Tff7b72=
Te6edf3NymeaWifiServiceTb4b4b4(
Te6edf3scanner Tff7b72= Te6edf3scannerTb4b4b4,
Te6edf3connectionFactory Tff7b72= Te6edf3FakeBleConnectionFactoryTb4b4b4(Te6edf3connectionTb4b4b4)Tb4b4b4,
Te6edf3dispatcher Tff7b72= Te6edf3DispatchersTb4b4b4.Te6edf3UnconfinedTb4b4b4,
Tb4b4b4)
Tff7b72return Te6edf3TripleTb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4, Te6edf3connectionTb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72suspend Tff7b72fun Td2a8ffconnectServiceTb4b4b4(
Te6edf3serviceTb4b4b4: Te6edf3NymeaWifiServiceTb4b4b4,
Te6edf3scannerTb4b4b4: Te6edf3FakeBleScannerTb4b4b4,
Te6edf3deviceNameTb4b4b4: Tffa657String? Tff7b72= Ta5d6ff"Ta5d6ffmpwrd-nm-1234Ta5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3ResultTff7b72<Tffa657StringTff7b72> Tb4b4b4{
Te6edf3scannerTb4b4b4.Te6edf3emitDeviceTb4b4b4(Te6edf3FakeBleDeviceTb4b4b4(Te6edf3addressTb4b4b4, Te6edf3name Tff7b72= Te6edf3deviceNameTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3serviceTb4b4b4.Te6edf3connectTb4b4b4(Tb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffemitResponseTb4b4b4(Te6edf3connectionTb4b4b4: Te6edf3FakeBleConnectionTb4b4b4, Te6edf3jsonTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3connectionTb4b4b4.Te6edf3serviceTb4b4b4.Te6edf3emitNotificationTb4b4b4(Te6edf3COMMANDER_RESPONSE_UUIDTb4b4b4, Tb4b4b4(Te6edf3json Tff7b72+ Ta5d6ff"Ta5d6ff\Ta5d6ffnTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}

T8b949e// -----------------------------------------------------------------------
T8b949e// connect()
T8b949e// -----------------------------------------------------------------------

Tf0883e@Test
Tff7b72fun Td2a8ff`connect succeeds and returns device name`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Tb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4) Tff7b72= Te6edf3createServiceTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3connectServiceTb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isSuccessTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6ffmpwrd-nm-1234Ta5d6ff"Tb4b4b4, Te6edf3resultTb4b4b4.Te6edf3getOrThrowTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`connect returns device address when name is null`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Tb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4) Tff7b72= Te6edf3createServiceTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3connectServiceTb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4, Te6edf3deviceName Tff7b72= Tff7b72nullTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isSuccessTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3addressTb4b4b4, Te6edf3resultTb4b4b4.Te6edf3getOrThrowTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`connect fails when BLE connection fails`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3connection Tff7b72= Te6edf3FakeBleConnectionTb4b4b4(Tb4b4b4)
Te6edf3connectionTb4b4b4.Te6edf3failNextN Tff7b72= T79c0ff1
Tff7b72val Tb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4) Tff7b72= Te6edf3createServiceTb4b4b4(Te6edf3connection Tff7b72= Te6edf3connectionTb4b4b4)

Te6edf3scannerTb4b4b4.Te6edf3emitDeviceTb4b4b4(Te6edf3FakeBleDeviceTb4b4b4(Te6edf3addressTb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3serviceTb4b4b4.Te6edf3connectTb4b4b4(Tb4b4b4)

Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isFailureTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`connect fails when BLE throws exception`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3connection Tff7b72= Te6edf3FakeBleConnectionTb4b4b4(Tb4b4b4)
Te6edf3connectionTb4b4b4.Te6edf3connectException Tff7b72= Te6edf3RuntimeExceptionTb4b4b4(Ta5d6ff"Ta5d6ffBluetooth offTa5d6ff"Tb4b4b4)
Tff7b72val Tb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4) Tff7b72= Te6edf3createServiceTb4b4b4(Te6edf3connection Tff7b72= Te6edf3connectionTb4b4b4)

Te6edf3scannerTb4b4b4.Te6edf3emitDeviceTb4b4b4(Te6edf3FakeBleDeviceTb4b4b4(Te6edf3addressTb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3serviceTb4b4b4.Te6edf3connectTb4b4b4(Tb4b4b4)

Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isFailureTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3exceptionOrNullTb4b4b4(Tb4b4b4)Tff7b72?.Te6edf3messageTff7b72?.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffBluetooth offTa5d6ff"Tb4b4b4) Tff7b72=Tff7b72= Tff7b72trueTb4b4b4)
Tb4b4b4}

T8b949e// -----------------------------------------------------------------------
T8b949e// scanNetworks()
T8b949e// -----------------------------------------------------------------------

Tf0883e@Test
Tff7b72fun Td2a8ff`scanNetworks returns parsed network list`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3connection Tff7b72= Te6edf3FakeBleConnectionTb4b4b4(Tb4b4b4)
Tff7b72val Tb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4) Tff7b72= Te6edf3createServiceTb4b4b4(Te6edf3connection Tff7b72= Te6edf3connectionTb4b4b4)
Te6edf3connectServiceTb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4)

T8b949e// Enqueue scan ack + networks response
Te6edf3emitResponseTb4b4b4(Te6edf3connectionTb4b4b4, Ta5d6ff"""Ta5d6ff{Ta5d6ff"Ta5d6ffcTa5d6ff"Ta5d6ff:4,Ta5d6ff"Ta5d6ffrTa5d6ff"Ta5d6ff:0}Ta5d6ff"""Tb4b4b4)
Te6edf3emitResponseTb4b4b4(
Te6edf3connectionTb4b4b4,
Ta5d6ff"""Ta5d6ff{Ta5d6ff"Ta5d6ffcTa5d6ff"Ta5d6ff:0,Ta5d6ff"Ta5d6ffrTa5d6ff"Ta5d6ff:0,Ta5d6ff"Ta5d6ffpTa5d6ff"Ta5d6ff:[
{Ta5d6ff"Ta5d6ffeTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffHomeWifiTa5d6ff"Ta5d6ff,Ta5d6ff"Ta5d6ffmTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffAA:BB:CC:DD:EE:01Ta5d6ff"Ta5d6ff,Ta5d6ff"Ta5d6ffsTa5d6ff"Ta5d6ff:85,Ta5d6ff"Ta5d6ffpTa5d6ff"Ta5d6ff:1},
{Ta5d6ff"Ta5d6ffeTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffOpenNetTa5d6ff"Ta5d6ff,Ta5d6ff"Ta5d6ffmTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffAA:BB:CC:DD:EE:02Ta5d6ff"Ta5d6ff,Ta5d6ff"Ta5d6ffsTa5d6ff"Ta5d6ff:60,Ta5d6ff"Ta5d6ffpTa5d6ff"Ta5d6ff:0}
]}Ta5d6ff"""Tb4b4b4,
Tb4b4b4)

Tff7b72val Te6edf3result Tff7b72= Te6edf3serviceTb4b4b4.Te6edf3scanNetworksTb4b4b4(Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isSuccessTb4b4b4)

Tff7b72val Te6edf3networks Tff7b72= Te6edf3resultTb4b4b4.Te6edf3getOrThrowTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff2Tb4b4b4, Te6edf3networksTb4b4b4.Te6edf3sizeTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6ffHomeWifiTa5d6ff"Tb4b4b4, Te6edf3networksTff7b72[T79c0ff0Tff7b72]Tb4b4b4.Te6edf3ssidTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff8T79c0ff5Tb4b4b4, Te6edf3networksTff7b72[T79c0ff0Tff7b72]Tb4b4b4.Te6edf3signalStrengthTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3networksTff7b72[T79c0ff0Tff7b72]Tb4b4b4.Te6edf3isProtectedTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6ffOpenNetTa5d6ff"Tb4b4b4, Te6edf3networksTff7b72[T79c0ff1Tff7b72]Tb4b4b4.Te6edf3ssidTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Tff7b72falseTb4b4b4, Te6edf3networksTff7b72[T79c0ff1Tff7b72]Tb4b4b4.Te6edf3isProtectedTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`scanNetworks returns empty list when device has no networks`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3connection Tff7b72= Te6edf3FakeBleConnectionTb4b4b4(Tb4b4b4)
Tff7b72val Tb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4) Tff7b72= Te6edf3createServiceTb4b4b4(Te6edf3connection Tff7b72= Te6edf3connectionTb4b4b4)
Te6edf3connectServiceTb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4)

Te6edf3emitResponseTb4b4b4(Te6edf3connectionTb4b4b4, Ta5d6ff"""Ta5d6ff{Ta5d6ff"Ta5d6ffcTa5d6ff"Ta5d6ff:4,Ta5d6ff"Ta5d6ffrTa5d6ff"Ta5d6ff:0}Ta5d6ff"""Tb4b4b4)
Te6edf3emitResponseTb4b4b4(Te6edf3connectionTb4b4b4, Ta5d6ff"""Ta5d6ff{Ta5d6ff"Ta5d6ffcTa5d6ff"Ta5d6ff:0,Ta5d6ff"Ta5d6ffrTa5d6ff"Ta5d6ff:0,Ta5d6ff"Ta5d6ffpTa5d6ff"Ta5d6ff:[]}Ta5d6ff"""Tb4b4b4)

Tff7b72val Te6edf3result Tff7b72= Te6edf3serviceTb4b4b4.Te6edf3scanNetworksTb4b4b4(Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isSuccessTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3getOrThrowTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`scanNetworks fails when scan command returns error`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3connection Tff7b72= Te6edf3FakeBleConnectionTb4b4b4(Tb4b4b4)
Tff7b72val Tb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4) Tff7b72= Te6edf3createServiceTb4b4b4(Te6edf3connection Tff7b72= Te6edf3connectionTb4b4b4)
Te6edf3connectServiceTb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4)

T8b949e// Scan returns error code 4 (wireless unavailable)
Te6edf3emitResponseTb4b4b4(Te6edf3connectionTb4b4b4, Ta5d6ff"""Ta5d6ff{Ta5d6ff"Ta5d6ffcTa5d6ff"Ta5d6ff:4,Ta5d6ff"Ta5d6ffrTa5d6ff"Ta5d6ff:4}Ta5d6ff"""Tb4b4b4)

Tff7b72val Te6edf3result Tff7b72= Te6edf3serviceTb4b4b4.Te6edf3scanNetworksTb4b4b4(Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isFailureTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3exceptionOrNullTb4b4b4(Tb4b4b4)Tff7b72?.Te6edf3messageTff7b72?.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffScan command failedTa5d6ff"Tb4b4b4) Tff7b72=Tff7b72= Tff7b72trueTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`scanNetworks sends correct BLE commands`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3connection Tff7b72= Te6edf3FakeBleConnectionTb4b4b4(Tb4b4b4)
Tff7b72val Tb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4) Tff7b72= Te6edf3createServiceTb4b4b4(Te6edf3connection Tff7b72= Te6edf3connectionTb4b4b4)
Te6edf3connectServiceTb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4)

Te6edf3emitResponseTb4b4b4(Te6edf3connectionTb4b4b4, Ta5d6ff"""Ta5d6ff{Ta5d6ff"Ta5d6ffcTa5d6ff"Ta5d6ff:4,Ta5d6ff"Ta5d6ffrTa5d6ff"Ta5d6ff:0}Ta5d6ff"""Tb4b4b4)
Te6edf3emitResponseTb4b4b4(Te6edf3connectionTb4b4b4, Ta5d6ff"""Ta5d6ff{Ta5d6ff"Ta5d6ffcTa5d6ff"Ta5d6ff:0,Ta5d6ff"Ta5d6ffrTa5d6ff"Ta5d6ff:0,Ta5d6ff"Ta5d6ffpTa5d6ff"Ta5d6ff:[]}Ta5d6ff"""Tb4b4b4)

Te6edf3serviceTb4b4b4.Te6edf3scanNetworksTb4b4b4(Tb4b4b4)

T8b949e// Verify the commander writes contain the scan command and get-networks command
Tff7b72val Te6edf3commanderWrites Tff7b72=
Te6edf3connectionTb4b4b4.Te6edf3serviceTb4b4b4.Te6edf3writes
Tb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3characteristicTb4b4b4.Te6edf3uuid Tff7b72=Tff7b72= Te6edf3WIRELESS_COMMANDER_UUID Tb4b4b4}
Tb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3decodeToStringTb4b4b4(Tb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3joinToStringTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)

Te6edf3assertTrueTb4b4b4(Te6edf3commanderWritesTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff\"Ta5d6ffcTa5d6ff\"Ta5d6ff:4Ta5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffShould send CMD_SCAN (4)Ta5d6ff"Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3commanderWritesTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff\"Ta5d6ffcTa5d6ff\"Ta5d6ff:0Ta5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffShould send CMD_GET_NETWORKS (0)Ta5d6ff"Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`scanNetworks uses WITH_RESPONSE write type`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3connection Tff7b72= Te6edf3FakeBleConnectionTb4b4b4(Tb4b4b4)
Tff7b72val Tb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4) Tff7b72= Te6edf3createServiceTb4b4b4(Te6edf3connection Tff7b72= Te6edf3connectionTb4b4b4)
Te6edf3connectServiceTb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4)

Te6edf3emitResponseTb4b4b4(Te6edf3connectionTb4b4b4, Ta5d6ff"""Ta5d6ff{Ta5d6ff"Ta5d6ffcTa5d6ff"Ta5d6ff:4,Ta5d6ff"Ta5d6ffrTa5d6ff"Ta5d6ff:0}Ta5d6ff"""Tb4b4b4)
Te6edf3emitResponseTb4b4b4(Te6edf3connectionTb4b4b4, Ta5d6ff"""Ta5d6ff{Ta5d6ff"Ta5d6ffcTa5d6ff"Ta5d6ff:0,Ta5d6ff"Ta5d6ffrTa5d6ff"Ta5d6ff:0,Ta5d6ff"Ta5d6ffpTa5d6ff"Ta5d6ff:[]}Ta5d6ff"""Tb4b4b4)

Te6edf3serviceTb4b4b4.Te6edf3scanNetworksTb4b4b4(Tb4b4b4)

Tff7b72val Te6edf3commanderWrites Tff7b72= Te6edf3connectionTb4b4b4.Te6edf3serviceTb4b4b4.Te6edf3writesTb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3characteristicTb4b4b4.Te6edf3uuid Tff7b72=Tff7b72= Te6edf3WIRELESS_COMMANDER_UUID Tb4b4b4}
Te6edf3assertTrueTb4b4b4(Te6edf3commanderWritesTb4b4b4.Te6edf3all Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3writeType Tff7b72=Tff7b72= Te6edf3BleWriteTypeTb4b4b4.Te6edf3WITH_RESPONSE Tb4b4b4}Tb4b4b4)
Tb4b4b4}

T8b949e// -----------------------------------------------------------------------
T8b949e// provision()
T8b949e// -----------------------------------------------------------------------

Tf0883e@Test
Tff7b72fun Td2a8ff`provision returns Success on response code 0`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3connection Tff7b72= Te6edf3FakeBleConnectionTb4b4b4(Tb4b4b4)
Tff7b72val Tb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4) Tff7b72= Te6edf3createServiceTb4b4b4(Te6edf3connection Tff7b72= Te6edf3connectionTb4b4b4)
Te6edf3connectServiceTb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4)

Te6edf3emitResponseTb4b4b4(Te6edf3connectionTb4b4b4, Ta5d6ff"""Ta5d6ff{Ta5d6ff"Ta5d6ffcTa5d6ff"Ta5d6ff:1,Ta5d6ff"Ta5d6ffrTa5d6ff"Ta5d6ff:0,Ta5d6ff"Ta5d6ffpTa5d6ff"Ta5d6ff:{Ta5d6ff"Ta5d6ffiTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ff10.10.10.61Ta5d6ff"Ta5d6ff}}Ta5d6ff"""Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3serviceTb4b4b4.Te6edf3provisionTb4b4b4(Ta5d6ff"Ta5d6ffMyNetTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpasswordTa5d6ff"Tb4b4b4)

Tff7b72val Te6edf3success Tff7b72= Te6edf3assertIsTff7b72<Te6edf3ProvisionResultTb4b4b4.Te6edf3SuccessTff7b72>Tb4b4b4(Te6edf3resultTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6ff10.10.10.61Ta5d6ff"Tb4b4b4, Te6edf3successTb4b4b4.Te6edf3ipAddressTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`provision falls back to GetConnection for IP when connect response has no payload`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3connection Tff7b72= Te6edf3FakeBleConnectionTb4b4b4(Tb4b4b4)
Tff7b72val Tb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4) Tff7b72= Te6edf3createServiceTb4b4b4(Te6edf3connection Tff7b72= Te6edf3connectionTb4b4b4)
Te6edf3connectServiceTb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4)

Te6edf3emitResponseTb4b4b4(Te6edf3connectionTb4b4b4, Ta5d6ff"""Ta5d6ff{Ta5d6ff"Ta5d6ffcTa5d6ff"Ta5d6ff:1,Ta5d6ff"Ta5d6ffrTa5d6ff"Ta5d6ff:0}Ta5d6ff"""Tb4b4b4)
Te6edf3emitResponseTb4b4b4(Te6edf3connectionTb4b4b4, Ta5d6ff"""Ta5d6ff{Ta5d6ff"Ta5d6ffcTa5d6ff"Ta5d6ff:5,Ta5d6ff"Ta5d6ffrTa5d6ff"Ta5d6ff:0,Ta5d6ff"Ta5d6ffpTa5d6ff"Ta5d6ff:{Ta5d6ff"Ta5d6ffiTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ff10.10.10.62Ta5d6ff"Ta5d6ff}}Ta5d6ff"""Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3serviceTb4b4b4.Te6edf3provisionTb4b4b4(Ta5d6ff"Ta5d6ffMyNetTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpasswordTa5d6ff"Tb4b4b4)

Tff7b72val Te6edf3success Tff7b72= Te6edf3assertIsTff7b72<Te6edf3ProvisionResultTb4b4b4.Te6edf3SuccessTff7b72>Tb4b4b4(Te6edf3resultTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6ff10.10.10.62Ta5d6ff"Tb4b4b4, Te6edf3successTb4b4b4.Te6edf3ipAddressTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`provision returns Failure on non-zero response code`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3connection Tff7b72= Te6edf3FakeBleConnectionTb4b4b4(Tb4b4b4)
Tff7b72val Tb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4) Tff7b72= Te6edf3createServiceTb4b4b4(Te6edf3connection Tff7b72= Te6edf3connectionTb4b4b4)
Te6edf3connectServiceTb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4)

Te6edf3emitResponseTb4b4b4(Te6edf3connectionTb4b4b4, Ta5d6ff"""Ta5d6ff{Ta5d6ff"Ta5d6ffcTa5d6ff"Ta5d6ff:1,Ta5d6ff"Ta5d6ffrTa5d6ff"Ta5d6ff:3}Ta5d6ff"""Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3serviceTb4b4b4.Te6edf3provisionTb4b4b4(Ta5d6ff"Ta5d6ffMyNetTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpasswordTa5d6ff"Tb4b4b4)

Te6edf3assertIsTff7b72<Te6edf3ProvisionResultTb4b4b4.Te6edf3FailureTff7b72>Tb4b4b4(Te6edf3resultTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff3Tb4b4b4, Te6edf3resultTb4b4b4.Te6edf3errorCodeTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3messageTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffNetworkManagerTa5d6ff"Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`provision sends CMD_CONNECT for visible networks`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3connection Tff7b72= Te6edf3FakeBleConnectionTb4b4b4(Tb4b4b4)
Tff7b72val Tb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4) Tff7b72= Te6edf3createServiceTb4b4b4(Te6edf3connection Tff7b72= Te6edf3connectionTb4b4b4)
Te6edf3connectServiceTb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4)

Te6edf3emitResponseTb4b4b4(Te6edf3connectionTb4b4b4, Ta5d6ff"""Ta5d6ff{Ta5d6ff"Ta5d6ffcTa5d6ff"Ta5d6ff:1,Ta5d6ff"Ta5d6ffrTa5d6ff"Ta5d6ff:0,Ta5d6ff"Ta5d6ffpTa5d6ff"Ta5d6ff:{Ta5d6ff"Ta5d6ffiTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ff10.10.10.61Ta5d6ff"Ta5d6ff}}Ta5d6ff"""Tb4b4b4)
Te6edf3serviceTb4b4b4.Te6edf3provisionTb4b4b4(Ta5d6ff"Ta5d6ffNetTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpassTa5d6ff"Tb4b4b4, Te6edf3hidden Tff7b72= Tff7b72falseTb4b4b4)

Tff7b72val Te6edf3writes Tff7b72=
Te6edf3connectionTb4b4b4.Te6edf3serviceTb4b4b4.Te6edf3writes
Tb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3characteristicTb4b4b4.Te6edf3uuid Tff7b72=Tff7b72= Te6edf3WIRELESS_COMMANDER_UUID Tb4b4b4}
Tb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3decodeToStringTb4b4b4(Tb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3joinToStringTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)

Te6edf3assertTrueTb4b4b4(Te6edf3writesTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff\"Ta5d6ffcTa5d6ff\"Ta5d6ff:1Ta5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffShould send CMD_CONNECT (1)Ta5d6ff"Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3writesTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff\"Ta5d6ffeTa5d6ff\"Ta5d6ff:Ta5d6ff\"Ta5d6ffNetTa5d6ff\"Ta5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffShould contain SSIDTa5d6ff"Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`provision sends CMD_CONNECT_HIDDEN for hidden networks`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3connection Tff7b72= Te6edf3FakeBleConnectionTb4b4b4(Tb4b4b4)
Tff7b72val Tb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4) Tff7b72= Te6edf3createServiceTb4b4b4(Te6edf3connection Tff7b72= Te6edf3connectionTb4b4b4)
Te6edf3connectServiceTb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4)

Te6edf3emitResponseTb4b4b4(Te6edf3connectionTb4b4b4, Ta5d6ff"""Ta5d6ff{Ta5d6ff"Ta5d6ffcTa5d6ff"Ta5d6ff:2,Ta5d6ff"Ta5d6ffrTa5d6ff"Ta5d6ff:0,Ta5d6ff"Ta5d6ffpTa5d6ff"Ta5d6ff:{Ta5d6ff"Ta5d6ffiTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ff10.10.10.61Ta5d6ff"Ta5d6ff}}Ta5d6ff"""Tb4b4b4)
Te6edf3serviceTb4b4b4.Te6edf3provisionTb4b4b4(Ta5d6ff"Ta5d6ffHiddenNetTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpassTa5d6ff"Tb4b4b4, Te6edf3hidden Tff7b72= Tff7b72trueTb4b4b4)

Tff7b72val Te6edf3writes Tff7b72=
Te6edf3connectionTb4b4b4.Te6edf3serviceTb4b4b4.Te6edf3writes
Tb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3characteristicTb4b4b4.Te6edf3uuid Tff7b72=Tff7b72= Te6edf3WIRELESS_COMMANDER_UUID Tb4b4b4}
Tb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3decodeToStringTb4b4b4(Tb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3joinToStringTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)

Te6edf3assertTrueTb4b4b4(Te6edf3writesTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff\"Ta5d6ffcTa5d6ff\"Ta5d6ff:2Ta5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffShould send CMD_CONNECT_HIDDEN (2)Ta5d6ff"Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`provision returns Failure on exception`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
T8b949e// Create a service with a connection that will fail writes after connecting
Tff7b72val Te6edf3connection Tff7b72= Te6edf3FakeBleConnectionTb4b4b4(Tb4b4b4)
Tff7b72val Tb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4) Tff7b72= Te6edf3createServiceTb4b4b4(Te6edf3connection Tff7b72= Te6edf3connectionTb4b4b4)
Te6edf3connectServiceTb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4)

T8b949e// Don't emit any response — this will cause a timeout. But since we use
T8b949e// Dispatchers.Unconfined the withTimeout may behave differently.
T8b949e// Instead, test a different error path: test that all nymea error codes are mapped.
Te6edf3emitResponseTb4b4b4(Te6edf3connectionTb4b4b4, Ta5d6ff"""Ta5d6ff{Ta5d6ff"Ta5d6ffcTa5d6ff"Ta5d6ff:1,Ta5d6ff"Ta5d6ffrTa5d6ff"Ta5d6ff:1}Ta5d6ff"""Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3serviceTb4b4b4.Te6edf3provisionTb4b4b4(Ta5d6ff"Ta5d6ffNetTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpassTa5d6ff"Tb4b4b4)
Te6edf3assertIsTff7b72<Te6edf3ProvisionResultTb4b4b4.Te6edf3FailureTff7b72>Tb4b4b4(Te6edf3resultTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3messageTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffInvalid commandTa5d6ff"Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`provision maps all known error codes`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3connection Tff7b72= Te6edf3FakeBleConnectionTb4b4b4(Tb4b4b4)
Tff7b72val Tb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4) Tff7b72= Te6edf3createServiceTb4b4b4(Te6edf3connection Tff7b72= Te6edf3connectionTb4b4b4)
Te6edf3connectServiceTb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4)

Tff7b72val Te6edf3errorCodes Tff7b72=
Te6edf3mapOfTb4b4b4(
T79c0ff1 Te6edf3to Ta5d6ff"Ta5d6ffInvalid commandTa5d6ff"Tb4b4b4,
T79c0ff2 Te6edf3to Ta5d6ff"Ta5d6ffInvalid parameterTa5d6ff"Tb4b4b4,
T79c0ff3 Te6edf3to Ta5d6ff"Ta5d6ffNetworkManager not availableTa5d6ff"Tb4b4b4,
T79c0ff4 Te6edf3to Ta5d6ff"Ta5d6ffWireless adapter not availableTa5d6ff"Tb4b4b4,
T79c0ff5 Te6edf3to Ta5d6ff"Ta5d6ffNetworking disabledTa5d6ff"Tb4b4b4,
T79c0ff6 Te6edf3to Ta5d6ff"Ta5d6ffWireless disabledTa5d6ff"Tb4b4b4,
T79c0ff7 Te6edf3to Ta5d6ff"Ta5d6ffUnknown errorTa5d6ff"Tb4b4b4,
Tb4b4b4)

Tff7b72for Tb4b4b4(Tb4b4b4(Te6edf3codeTb4b4b4, Te6edf3expectedMessageTb4b4b4) Tff7b72in Te6edf3errorCodesTb4b4b4) Tb4b4b4{
Te6edf3emitResponseTb4b4b4(Te6edf3connectionTb4b4b4, Ta5d6ff"""Ta5d6ff{Ta5d6ff"Ta5d6ffcTa5d6ff"Ta5d6ff:1,Ta5d6ff"Ta5d6ffrTa5d6ff"Ta5d6ff:Tffd700$Te6edf3codeTa5d6ff}Ta5d6ff"""Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3serviceTb4b4b4.Te6edf3provisionTb4b4b4(Ta5d6ff"Ta5d6ffNetTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpassTa5d6ff"Tb4b4b4)
Te6edf3assertIsTff7b72<Te6edf3ProvisionResultTb4b4b4.Te6edf3FailureTff7b72>Tb4b4b4(Te6edf3resultTb4b4b4)
Te6edf3assertTrueTb4b4b4(
Te6edf3resultTb4b4b4.Te6edf3messageTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3expectedMessageTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffError code Tffd700$Te6edf3codeTa5d6ff should map to 'Tffd700$Te6edf3expectedMessageTa5d6ff', got 'Tffd700${Te6edf3resultTb4b4b4.Te6edf3messageTffd700}Ta5d6ff'Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

T8b949e// -----------------------------------------------------------------------
T8b949e// close()
T8b949e// -----------------------------------------------------------------------

Tf0883e@Test
Tff7b72fun Td2a8ff`close disconnects BLE`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3connection Tff7b72= Te6edf3FakeBleConnectionTb4b4b4(Tb4b4b4)
Tff7b72val Tb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4) Tff7b72= Te6edf3createServiceTb4b4b4(Te6edf3connection Tff7b72= Te6edf3connectionTb4b4b4)
Te6edf3connectServiceTb4b4b4(Te6edf3serviceTb4b4b4, Te6edf3scannerTb4b4b4)

Te6edf3serviceTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)

Te6edf3assertTrueTb4b4b4(Te6edf3connectionTb4b4b4.Te6edf3disconnectCalls Tff7b72>Tff7b72= T79c0ff1Tb4b4b4, Ta5d6ff"Ta5d6ffShould call BLE disconnectTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.1s